Spring Data JPA একটি শক্তিশালী টুল যা ডেটাবেসে Custom Queries তৈরি করতে এবং কার্যকরভাবে ডেটা ম্যানিপুলেট করতে সাহায্য করে। আপনি JPQL (Java Persistence Query Language) বা native SQL queries ব্যবহার করে Spring Data JPA রেপোজিটরির মাধ্যমে কাস্টম কুয়েরি তৈরি করতে পারেন। এটি Repository ইন্টারফেসের মধ্যে কাস্টম মেথড তৈরি করে করতে হয়।
Spring Data JPA-তে কাস্টম কুয়েরি তৈরি করার জন্য দুইটি প্রধান উপায় রয়েছে:
- Query Annotation ব্যবহার করে।
- @Query অ্যানোটেশন ব্যবহার করে।
নিচে এই দুটি পদ্ধতির উদাহরণ সহ আলোচনা করা হয়েছে।
1. Query Annotation ব্যবহার করে Custom Queries
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম JPQL বা native SQL queries লিখতে পারেন। JPQL হল JPA-এর জন্য তৈরি করা একটি কুয়েরি ভাষা, যা ডেটাবেসের টেবিলের পরিবর্তে Entity ক্লাসে কাজ করে।
উদাহরণ: JPQL কুয়েরি ব্যবহার করে Custom Query
ধরা যাক, আমাদের একটি Product Entity রয়েছে এবং আমরা Product নামের একটি কাস্টম কুয়েরি তৈরি করতে চাই যা price এর ওপর ভিত্তি করে পণ্যগুলিকে ফিল্টার করবে।
Step 1: Entity Class
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
}
Step 2: Custom Query Repository Interface
Spring Data JPA-তে @Query অ্যানোটেশন ব্যবহার করে কাস্টম JPQL কুয়েরি তৈরি করা হয়েছে:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Custom JPQL Query using @Query annotation
@Query("SELECT p FROM Product p WHERE p.price > :price")
List<Product> findProductsByPriceGreaterThan(@Param("price") Double price);
}
এই কুয়েরিতে, আমরা Product টেবিল থেকে সেই সব পণ্য খুঁজে বের করছি, যেগুলোর মূল্য নির্দিষ্ট price এর চেয়ে বেশি।
Step 3: Main Application Class
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class SpringBootJpaApplication implements CommandLineRunner {
@Autowired
private ProductRepository productRepository;
public static void main(String[] args) {
SpringApplication.run(SpringBootJpaApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
List<Product> products = productRepository.findProductsByPriceGreaterThan(100.0);
products.forEach(product -> System.out.println("Product: " + product.getName() + " Price: " + product.getPrice()));
}
}
এই উদাহরণে, আমরা price 100 এর বেশি এমন পণ্যগুলো বের করেছি। @Query অ্যানোটেশন ব্যবহার করে কাস্টম JPQL কুয়েরি তৈরি করা হয়েছে।
2. Native SQL Queries ব্যবহার করে Custom Query
Spring Data JPA-তে native SQL queries ব্যবহার করতে @Query অ্যানোটেশনকে nativeQuery = true দিয়ে সেট করা হয়। এতে আমরা সরাসরি ডেটাবেসের টেবিলের উপর কাজ করতে পারি, যা JPQL-এর তুলনায় আরও ফ্লেক্সিবল হতে পারে।
উদাহরণ: Native SQL কুয়েরি ব্যবহার করে Custom Query
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Custom Native SQL Query using @Query annotation
@Query(value = "SELECT * FROM product WHERE price > ?1", nativeQuery = true)
List<Product> findProductsByPriceGreaterThanNative(Double price);
}
এখানে, @Query অ্যানোটেশনের মধ্যে nativeQuery = true সেট করা হয়েছে, যার মাধ্যমে আমরা সরাসরি SQL কুয়েরি লিখতে পারি।
Step 2: Main Application Class
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.util.List;
@SpringBootApplication
public class SpringBootJpaApplication implements CommandLineRunner {
@Autowired
private ProductRepository productRepository;
public static void main(String[] args) {
SpringApplication.run(SpringBootJpaApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
List<Product> products = productRepository.findProductsByPriceGreaterThanNative(100.0);
products.forEach(product -> System.out.println("Product: " + product.getName() + " Price: " + product.getPrice()));
}
}
এই উদাহরণে, আমরা native SQL query ব্যবহার করে একই ফলাফল অর্জন করেছি।
3. Named Queries ব্যবহার করে Custom Query
Spring Data JPA আরও একটি বিকল্প প্রদান করে, যেখানে আমরা Named Queries ব্যবহার করে কাস্টম কুয়েরি তৈরি করতে পারি। Named Queries ব্যবহার করার জন্য আপনাকে @Query অ্যানোটেশন ব্যবহারের পরিবর্তে @NamedQuery ব্যবহার করতে হবে।
উদাহরণ:
@Entity
@NamedQueries({
@NamedQuery(name = "Product.findByPrice", query = "SELECT p FROM Product p WHERE p.price > :price")
})
public class Product {
@Id
private Long id;
private String name;
private Double price;
// Getters and Setters
}
এবং রেপোজিটরিতে কাস্টম মেথড:
@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
// Using NamedQuery
List<Product> findByPriceGreaterThan(@Param("price") Double price);
}
এখানে, NamedQuery ব্যবহারের মাধ্যমে findByPriceGreaterThan মেথডটি Product Entity ক্লাসের মধ্যে সংজ্ঞায়িত কুয়েরির মাধ্যমে কার্যকর হবে।
সারাংশ
Spring Data JPA তে কাস্টম কুয়েরি তৈরি করা একটি শক্তিশালী এবং নমনীয় পদ্ধতি যা JPQL, native SQL, এবং Named Queries এর মাধ্যমে করা যায়। এর মাধ্যমে আপনি Spring Repository ইন্টারফেসের মধ্যে কাস্টম ডেটাবেস অপারেশন এবং কুয়েরি কার্যকরীভাবে পরিচালনা করতে পারেন। কাস্টম কুয়েরি ব্যবহার করলে অ্যাপ্লিকেশনের কার্যকারিতা এবং স্কেলেবিলিটি বৃদ্ধি পায় এবং বিশেষ প্রয়োজনে ডেটাবেসের গভীর কাস্টমাইজেশন সম্ভব হয়।
Read more